//package pl.edu.pw.perg.compinfodb.ui;
//
//import java.awt.Component;
//import java.awt.GridBagConstraints;
//import java.awt.GridBagLayout;
//import java.util.ArrayList;
//import java.util.List;
//
//import javax.swing.DefaultCellEditor;
//import javax.swing.JCheckBox;
//import javax.swing.JComponent;
//import javax.swing.JPanel;
//import javax.swing.JScrollPane;
//import javax.swing.JSplitPane;
//import javax.swing.JTable;
//import javax.swing.JTextField;
//import javax.swing.JTree;
//import javax.swing.border.TitledBorder;
//import javax.swing.event.ListSelectionEvent;
//import javax.swing.event.TableModelEvent;
//import javax.swing.table.DefaultTableModel;
//import javax.swing.tree.DefaultTreeCellRenderer;
//import javax.swing.tree.TreeCellRenderer;
//
//import org.springframework.richclient.application.support.AbstractView;
//import org.springframework.richclient.tree.FocusableTreeCellRenderer;
//
//import pl.edu.pw.perg.compinfodb.datamodel.ConnectorTableModel;
//import pl.edu.pw.perg.compinfodb.datamodel.HistoryTableModel;
//import pl.edu.pw.perg.compinfodb.datamodel.IPhysicalElementSelectionListener;
//import pl.edu.pw.perg.compinfodb.datamodel.IStructureTreeSelectionListener;
//import pl.edu.pw.perg.compinfodb.datamodel.LogicalDetailsTableModel;
//import pl.edu.pw.perg.compinfodb.datamodel.SelectableTreeNode;
//import pl.edu.pw.perg.compinfodb.datamodel.StructureTreeModel;
//import pl.edu.pw.perg.compinfodb.entities.Connector;
//import pl.edu.pw.perg.compinfodb.entities.IVirtualElement;
//import pl.edu.pw.perg.compinfodb.entities.PhysicalElement;
//import pl.edu.pw.perg.compinfodb.entities.VirtualElement;
//import pl.edu.pw.perg.compinfodb.manager.IComplexElementManager;
//import pl.edu.pw.perg.compinfodb.manager.IConnectorManager;
//
//public class ConnectionManagerView extends AbstractView implements
//		IStructureTreeSelectionListener {
//
//	private VirtualElement virtualElement;
//	private VirtualElement selectedPathElement;
//	private IConnectorManager connectorManager;
//	private IComplexElementManager complexElementManager;
//
//	private List<IPhysicalElementSelectionListener> listeners = new ArrayList<IPhysicalElementSelectionListener>();
//
//	public IComplexElementManager getComplexElementManager() {
//		return complexElementManager;
//	}
//
//	public void setComplexElementManager(
//			IComplexElementManager complexElementManager) {
//		this.complexElementManager = complexElementManager;
//	}
//
//	private Connector inputConnector;
//	private Connector outputConnector;
//
//	private VirtualElement selectedVirtualElement;
//	private PhysicalElement selectedPhysicalElement;
//	private JTable connectors;
//	// private JTable outputConnectors;
//	private JTable connectionPath;
//	private JTable elementsLogicalDetails;
//
//	private StructureTreeModel structureTreeModel;
//	private JTree hierarchyTree;
//
//	private JCheckBox includeCables;
//	private JTable elementsPhysicalDetails;
//	private HistoryTableModel historyTableModel;
//
//	public HistoryTableModel getHistoryTableModel() {
//		return historyTableModel;
//	}
//
//	public void setHistoryTableModel(HistoryTableModel historyTableModel) {
//		this.historyTableModel = historyTableModel;
//	}
//
//	@Override
//	protected JComponent createControl() {
//
//		JPanel view = new JPanel(new GridBagLayout());
//		//
//		GridBagConstraints c = new GridBagConstraints();
//		//    
//		// connectors = createTableConnectors();
//		// outputConnectors = createTableOutputConnectors();
//		connectionPath = createTableConnectionPath();
//		elementsLogicalDetails = createLogicalElementDetails();
//		elementsPhysicalDetails = createPhysicalElementDetails();
//		includeCables = createChBIncludeCables();
//		hierarchyTree = new JTree(structureTreeModel);
//		hierarchyTree.addTreeSelectionListener(structureTreeModel);
//		hierarchyTree.setCellRenderer(treeCellRenderer);
//
//		c.fill = GridBagConstraints.BOTH;
//		c.weightx = 0.5;
//		c.weighty = 0.5;
//		c.gridx = 0;
//		c.gridy = 0;
//		c.gridheight = 1;
//		c.gridwidth = 1;
//
//		ConnectorTableModel inputConnTableModel = new ConnectorTableModel(true);
//		ConnectorTableModel outputConnTableModel = new ConnectorTableModel(
//				false);
//		structureTreeModel.addSelectionListener(this);
////		structureTreeModel.addSelectionListener(inputConnTableModel);
////		structureTreeModel.addSelectionListener(outputConnTableModel);
//
//		JTable pathTable = new JTable();
//		JTable detailsTable = new JTable();
//		JTable connectorsTableIn = new JTable(inputConnTableModel) {
//			@Override
//			public void tableChanged(TableModelEvent e) {
//				super.tableChanged(e);
//				for (int i = 0; i < getColumnCount(); i++) {
//					getColumnModel().getColumn(i).setCellRenderer(
//							new ColorRenderer());
//				}
//			}
//		};
//		JTable connectorsTableOut = new JTable(outputConnTableModel) {
//			@Override
//			public void tableChanged(TableModelEvent e) {
//				super.tableChanged(e);
//				for (int i = 0; i < getColumnCount(); i++) {
//					getColumnModel().getColumn(i).setCellRenderer(
//							new ColorRenderer());
//				}
//			}
//		};
//
//		JTable historyTable = createHistoryTable();
//
//		JScrollPane logicalDetailsScroll = new JScrollPane(
//				elementsLogicalDetails);
//		JScrollPane physicalDetailsScroll = new JScrollPane(
//				elementsPhysicalDetails);
//		JScrollPane connectorsInScroll = new JScrollPane(connectorsTableIn);
//		JScrollPane connectorsOutScroll = new JScrollPane(connectorsTableOut);
//		JScrollPane historyScroll = new JScrollPane(historyTable);
//		JScrollPane pathScroll = new JScrollPane(pathTable);
//		JScrollPane treeScroll = new JScrollPane(hierarchyTree);
//
//		treeScroll.setBorder(new TitledBorder("Element Tree"));
//		pathScroll.setBorder(new TitledBorder("Connection Path"));
//		connectorsInScroll.setBorder(new TitledBorder(
//				"Element's Input Connectors"));
//		connectorsOutScroll.setBorder(new TitledBorder(
//				"Element's Output Connectors"));
//		logicalDetailsScroll.setBorder(new TitledBorder(
//				"Element's Logical Details"));
//		physicalDetailsScroll.setBorder(new TitledBorder(
//				"Element's Physical Details"));
//		historyScroll.setBorder(new TitledBorder("Element's History"));
//
//		JSplitPane connectorsSplit = new JSplitPane(
//				JSplitPane.HORIZONTAL_SPLIT, connectorsInScroll,
//				connectorsOutScroll);
//		JSplitPane detailsSplit = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
//				logicalDetailsScroll, physicalDetailsScroll);
//		
//		JSplitPane connectors2DetailsSplit = new JSplitPane(
//				JSplitPane.HORIZONTAL_SPLIT, connectorsSplit, detailsSplit);
//		JSplitPane path2ConnectorsDetailsSplit = new JSplitPane(
//				JSplitPane.VERTICAL_SPLIT, pathScroll, connectors2DetailsSplit);
//		JSplitPane history2pathSplit = new JSplitPane(
//				JSplitPane.VERTICAL_SPLIT, path2ConnectorsDetailsSplit,
//				historyScroll);
//		JSplitPane tree2historySplit = new JSplitPane(
//				JSplitPane.HORIZONTAL_SPLIT, treeScroll, history2pathSplit);
//		view.add(tree2historySplit, c);
//
//		detailsSplit.setOneTouchExpandable(true);
//		detailsSplit.setDividerLocation(200);
//		tree2historySplit.setDividerLocation(200);
//		connectors2DetailsSplit.setDividerLocation(500);
//		tree2historySplit.setOneTouchExpandable(true);
//		path2ConnectorsDetailsSplit.setDividerLocation(80);
//		path2ConnectorsDetailsSplit.setOneTouchExpandable(true);
//		history2pathSplit.setOneTouchExpandable(true);
//		history2pathSplit.setDividerLocation(500);
//		connectors2DetailsSplit.setDividerLocation(600);
//		connectorsSplit.setDividerLocation(300);
//
//		// jSplitPane1.setMinimumSize(new Dimension(200, 200));
//
//		DefaultTableModel dtm = new DefaultTableModel(
//				new Object[][] { { "LB_RB+1_S1_BP1E_CH0", "PP_LB_YB-2_FAR",
//						"SP_4_1", "TBn3_1" } }, new String[] { "LINKBOARD",
//						"TOWERPATCHPANEL", "SPLITTERBOARD", "TRIGGERBOARD" });
//		// pathTable.setModel(dtm);
//		// historyTable.setModel(dtm);
//
//		detailsTable.setModel(new DefaultTableModel(
//				new Object[][] { { "Name", "LB_RB+1_S1_BP1E_CH0" },
//						{ "Type", "LINKBOARD" }, { "Slot", "N/A" },
//						{ "Abbreviation", "LB" }, { "State", "OK" } },
//				new String[] { "Element's property", "Value" }));
//
//		// connectorsTableIn.setModel(new DefaultTableModel(
//		// new Object [][] {
//		// {"Empty", "Empty", "1", "1",
//		// "SPC_RB+1_S01_Bp1c_TC00/6/4x3/1_TC00/16/2", "PP_LB_YB-2_FAR"},
//		// {"Empty", "Empty", "2", null,
//		// null, null},
//		// {"Empty", "Empty", "3", null,
//		// null, null},
//		// {"Empty", "Empty", "4", null,
//		// null, null},
//		// {"Empty", "Empty", "5", null,
//		// null, null},
//		// {"Empty", "Empty", "6", null,
//		// null, null},
//		// },
//		// new String [] {
//		// "Element In", "Cable In", "In", "Out", "Cable Out", "Element Out"
//		// }
//		// ));
//
//		return view;
//	}
//
//	// private JTable createTableConnectors() {
//	// ConnectorTableModel tm = new ConnectorTableModel();
//	//    
//	// JTable table = new JTable(tm){
//	// @Override
//	// public void tableChanged(TableModelEvent e) {
//	// super.tableChanged(e);
//	// for (int i = 0; i < getColumnCount(); i++) {
//	// getColumnModel().getColumn(i).setCellRenderer(new ColorRenderer());
//	// }
//	// }
//	// };
//	// return table;
//	// }
//
//	private JTable createLogicalElementDetails() {
//		LogicalDetailsTableModel ldtm = new LogicalDetailsTableModel();
//		structureTreeModel.addSelectionListener(ldtm);
//		return new JTable(ldtm){
//			@Override
//			public void tableChanged(TableModelEvent e) {
//				super.tableChanged(e);
//				for (int i = 0; i < getColumnCount(); i++) {
//					getColumnModel().getColumn(i).setCellRenderer(
//							new ColorRenderer());
//				}
//			}
//		};
//	}
//
//	private JTable createHistoryTable() {
//		listeners.add(historyTableModel);
//		JTable table = new JTable(historyTableModel){
//			@Override
//			public void tableChanged(TableModelEvent e) {
//				super.tableChanged(e);
//				for (int i = 0; i < getColumnCount(); i++) {
//					getColumnModel().getColumn(i).setCellRenderer(
//							new ColorRenderer());
//					getColumnModel().getColumn(i).setCellEditor(new DefaultCellEditor(new JTextField()));
//				}
//			}
//		};
//		table.addKeyListener(new HistoryKeyListener());
//		return table;
//	}
//	
//	private JTable createPhysicalElementDetails() {
//		return new JTable();
////		TODO: kod ponizej wylaczony - na razie brak atrybutow.
//		
////		PhysicalDetailsTableModel pdtm = new PhysicalDetailsTableModel();
////		listeners.add(pdtm);
////		return new JTable(pdtm){
////			@Override
////			public void tableChanged(TableModelEvent e) {
////				super.tableChanged(e);
////				for (int i = 0; i < getColumnCount(); i++) {
////					getColumnModel().getColumn(i).setCellRenderer(
////							new ColorRenderer());
////				}
////			}
////		};
//	}
//
//	private JTable createTableConnectionPath() {
//
//		Connector left = inputConnector;
//		Connector right = outputConnector;
//
//		// DefaultMutableTreeNode leftTreeRoot = getPathTree(left);
//		// DefaultMutableTreeNode rightTreeRoot = getPathTree(right);
//		// List<List<VirtualElement>> pathList =
//		// PathTreeUtils.createPathList(leftTreeRoot,
//		// virtualElement, rightTreeRoot);
//		// PathTableModel ptm = new PathTableModel(pathList);
//		// includeCables.addChangeListener(ptm);
//		return new JTable();
//	}
//
//	/**
//	 * Metoda zwraca drzewo elementow, znajdujacych sie na polsciezce z danego
//	 * connectora. Od tego czy connector jest we czy wy zalezy ktora to
//	 * polsciezka bedzie.
//	 * 
//	 * @param conn
//	 * @return
//	 */
//	// private DefaultMutableTreeNode getPathTree(Connector conn) {
//	// Connector nextOutput = connectorManager.getNext(inputConnector);
//	// DefaultMutableTreeNode node = new
//	// DefaultMutableTreeNode(nextOutput.getElement());
//	// // przypadek: connector lewy, idziemy w lewo
//	// if (conn.getInput()) {
//	// // jesli prawy connector kolejnego elementu jest dwukierunkowy
//	// if (nextOutput instanceof OutputBidirConnector) {
//	// OutputBidirConnector bidirLeft = (OutputBidirConnector) nextOutput;
//	// Set<Connector> connectors = bidirLeft.getInternalConnections();
//	// // rekurencyjnie wywolujemy metode dla kazdego z connectorow
//	// for (Connector connector : connectors) {
//	// node.add(getPathTree(connector));
//	// }
//	// }
//	// // jesli nie jest, to koniec drzewa
//	// else
//	// return node;
//	// }
//	// // przypadek: connector prawy, idziemy w prawo
//	// else {
//	// if (nextOutput instanceof InputBidirConnector) {
//	// InputBidirConnector bidirLeft = (InputBidirConnector) nextOutput;
//	// Set<Connector> connectors = bidirLeft.getInternalConnections();
//	// // rekurencyjnie wywolujemy metode dla kazdego z connectorow
//	// for (Connector connector : connectors) {
//	// node.add(getPathTree(connector));
//	// }
//	// }
//	// // jesli nie jest, to koniec drzewa
//	// else
//	// return node;
//	// }
//	// // po dodaniu node'ow dzieci wychodzimy (jesli nie ma dzieci to samo
//	// wychodzi)
//	// return node;
//	//      
//	// }
//	private JCheckBox createChBIncludeCables() {
//		JCheckBox chkBox = new JCheckBox();
//		chkBox.setText("Include cables");
//		return chkBox;
//	}
//
//	public void setStructureTreeModel(StructureTreeModel structureTreeModel) {
//		this.structureTreeModel = structureTreeModel;
//		// structureTreeModel.addSelectionListener(this);
//	}
//
//	public void selectionChanged() {
//		// virtualElement = (VirtualElement)
//		// structureTreeModel.getSelectedElement();
//		// // ConnectorTableModel cm =
//		// (ConnectorTableModel)connectors.getModel();
//		// // ConnectorTableModel cmOut =
//		// (ConnectorTableModel)outputConnectors.getModel();
//		// // cm.setVirtualElement(virtualElement);
//		// // cmIn.setConnsMap(getConnsMap(virtualElement, true));
//		// // cmOut.setVirtualElement(virtualElement);
//		// // cmOut.setConnsMap(getConnsMap(virtualElement, false));
//	}
//
//	// private Map<Connector, Connector> getConnsMap(VirtualElement ve, boolean
//	// input){
//	// Set<Connector> inputCons = ve.getInputConnectors();
//	// Set<Connector> outputCons = ve.getOutputConnectors();
//	// return connectorManager.getConnectorsMap(input? inputCons : outputCons);
//	// }
//
//	public void setConnectorManager(IConnectorManager connectorManager) {
//		this.connectorManager = connectorManager;
//	}
//
//	public TreeCellRenderer getTreeCellRenderer() {
//
//		return treeCellRenderer;
//	}
//
//	public void valueChanged(ListSelectionEvent arg0) {
//		// TODO Do czego to?
//
//	}
//
//	private DefaultTreeCellRenderer treeCellRenderer = new FocusableTreeCellRenderer() {
//
//		public Component getTreeCellRendererComponent(JTree tree, Object value,
//				boolean sel, boolean expanded, boolean leaf, int row,
//				boolean hasFocus) {
//			super.getTreeCellRendererComponent(tree, value, sel, expanded,
//					leaf, row, hasFocus);
//			SelectableTreeNode node = (SelectableTreeNode) value;
//			if (node.isRoot()) {
//				this.setIcon(getIconSource().getIcon("cms.bullet"));
//			} else {
//				IVirtualElement o = (IVirtualElement) node.getUserObject();
//				this.setText(o.toString());
//				// TODO: wyszarzanie jesli bez elementow
//				// if(o.)
//				if (!node.isSelected()) {
//
//					this
//							.setIcon(getIconSource().getIcon(
//									"not_selected.bullet"));
//				} else if (node.isSelected()) {
//					this.setIcon(getIconSource().getIcon("selected.bullet"));
//				}
//
//			}
//			return this;
//		}
//	};
//
//	public void selectionChanged(VirtualElement ve) {
//		if(ve == null)
//			return;
//		selectedVirtualElement = ve;
//		selectedPhysicalElement = complexElementManager.getPhysicalByVirtual(ve);
//		if(selectedPhysicalElement == null)
//			return;
//		for (IPhysicalElementSelectionListener l : listeners) {
//			l.selectionChanged(selectedPhysicalElement);
//		}
//	}
//
//}
